package com.quique.pfc.activities;

import java.util.ArrayList;
import java.util.Date;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import com.quique.pfc.R;
import com.quique.pfc.datos.BDAdapter;
import com.quique.pfc.datos.MoodleDao;
import com.quique.pfc.datos.Sesion;
import com.quique.pfc.dtos.DetalleCursoDto;
import com.quique.pfc.dtos.ElementoDetalleCursoDto;
import com.quique.pfc.dtos.ModuloDto;
import com.quique.pfc.dtos.SeccionDto;
import com.quique.pfc.utils.Constantes;
import com.quique.pfc.utils.FileUtils;
import com.quique.pfc.utils.adapters.ElementoCursoAdapter;

/**
 * 
 * Pantalla de la aplicacion donde se mostrara el detalle
 * de un curso y se dara la posibilidad al usuario 
 * de que se baje los documentos asociados al curso
 *
 */
public class DetalleCursoActivity extends Activity{
	
	/** Identificador unico en moodle del curso para el cual se va a mostrar el detalle */
	int idCurso;
	/** Elementos que componen el curso */
	ArrayList<ElementoDetalleCursoDto> elementos;
	/** Lista de elementos del curso que se mostrara en pantalla */
	ListView lv;
	/** Widget para mostrar un mensaje de espera */
	ProgressDialog progress = null;
	/** Objeto para acceder a la BBDD*/
	private BDAdapter mDbHelper;
	
	/** Contexto de la aplicacion. */
	Context ctx;
	
	/** Metodo que se ejecuta al crear la Activity */
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		ctx = this;
		FileUtils.ctx = ctx;
		configurarVista();
		Sesion.ctx = this;
		Bundle extras = getIntent().getExtras();
        idCurso = (extras != null) ? extras.getInt("cursoId") : null;
        new CalculoCursosTask().execute();
	}
	
	/** Configura (establece un adapter y comportamiento) a la lista de elementos del curso que se mostrara en pantalla */
	private void configurarLista()
	{
		lv = (ListView)findViewById(R.id.lista_elementos);
        lv.setDivider(null);
        lv.setDividerHeight(0);
        lv.setAdapter(new ElementoCursoAdapter(Sesion.ctx, R.layout.seccion_curso_item, elementos, idCurso));
	}
	/** Establece el XML que define la vista y le da comportamiento a los botones*/
	private void configurarVista()
	{
		super.setContentView(R.layout.detalle_curso);
		//evitamos que se ponga la pantalla en horizontal
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        final Button button = (Button) findViewById(R.id.boton_volver_detalle_curso);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) 
            {
            	//vamos al main_activity
//            	Intent i = new Intent(
//            			DetalleCursoActivity.this,
//            			CursosActivity.class);
//				
//				i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//				i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
//				startActivity(i);
            	onBackPressed();
            }
        });
	}
	
	
	/** Calcula el detalle del curso en segundo plano mientras muestra un mensaje de espera al usuario */
	class CalculoCursosTask extends AsyncTask<String, Integer, Boolean> 
	{
		/** Calcula el detalle del curso y configura el ListView */
		@Override
		protected Boolean doInBackground(String... params) 
		{
			//buscamos en moodle la informacion del curso 
			MoodleDao md = new MoodleDao();
	        //Obtengo el detalle del curso a traves de la api de moodle
	        Log.i("moodle", "Obteniendo el detalle del curso");
	        DetalleCursoDto detalleCurso = md.obtenerCurso(Sesion.token, idCurso);
	        //Del detalle del curso, obtengo la lista de secciones
	        ArrayList<SeccionDto> secciones = new ArrayList<SeccionDto>();
	        //Solo vamos a mostrar las secciones que sean visibles por el usuario
	        for(SeccionDto s: detalleCurso.secciones)
	        {
	        	secciones.add(s);
	        }
	        
	        //Componemos la lista de ElementoDetalleCursoDto para
	        //pasarsela al adapter
	        elementos =
	        		new ArrayList<ElementoDetalleCursoDto>();
	        for(SeccionDto s : detalleCurso.secciones)
	        {
	        	ElementoDetalleCursoDto e = new ElementoDetalleCursoDto();
	        	e.tipo = Constantes.SECCION;
	        	e.seccion = s;
	        	elementos.add(e);
	        	for(ModuloDto m : s.modules)
	        	{
	        		ElementoDetalleCursoDto em = new ElementoDetalleCursoDto();
	        		em.tipo = Constantes.MODULO;
	        		em.modulo = m;
	        		if(m.modname.equals("resource")) em.bajar = true;
	        		if(m.modname.equals("url"))
	        			{
	        				em.url = true;
	        			}
	        		if(m.modname.equals("folder")) em.carpeta = true;
	        		elementos.add(em);
	        	}
	        }
	        mDbHelper = new BDAdapter(ctx);
	        mDbHelper.open();
        	//Aprovechamos para introducir el registro de actividad de acceso al detalle del curso
        	mDbHelper.crearActividad(Sesion.cuenta, 3, new Date());
        	mDbHelper.close();
	        
			return Boolean.TRUE;   
		 }	
		/** Muestra un dialog al usuario mientras se realiza el calculo */
		@Override
		protected void onPreExecute() 
		{
			progress = ProgressDialog.show(Sesion.ctx, "", Sesion.ctx.getString(R.string.cargando), true);
			progress.show();
		}
		/** Metodo que se ejecuta cuando termina el calculo */
		@Override
		protected void onPostExecute(Boolean result) {
			//configuramos la lista
			configurarLista();
			//Cancelamos la pantalla de espera
			progress.dismiss();
		}
	}
	
	int rq;
	int rc; 
	Intent d;
	
	public void onActivityResult(int requestCode, int resultCode, Intent data) 
	{
		//El usuario ya ha seleccionado la foto
		//Guardamos los datos que devuelve el activity en atributos de
		//la clase para poder
		//realizar la subida en un thread en segundo plano
		rq = requestCode; rc = resultCode; d = data;
		Log.i("moodle", "El usuario selecciona una foto de su biblioteca");
		//LLamamos al Thread que se encarga de subir una foto al servidor.
		Log.i("moodle", "Se va a llamar al Thread de subida de ficheros al servidor..");
		//new VolverAppTask().execute();
		Log.i("moodle", "Thread invocado: se ejecutara en segundo plano..");
		if(requestCode == KeyEvent.KEYCODE_BACK){
			//venimos de la apertura de un documento, volvemos a DetalleCursoActivity
			Intent i = new Intent(
	    			DetalleCursoActivity.this,
	    			DetalleCursoActivity.class);
			
			i.putExtra("cursoId", this.idCurso);
			
			i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
			startActivity(i);
		}
		this.finish();
	}
	
	@Override
	public void onBackPressed()
	{
		//vamos al main_activity
    	Intent i = new Intent(
    			DetalleCursoActivity.this,
    			CursosActivity.class);
		
		i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
		startActivity(i);
		this.finish();
	}
	
	
}

